package linkedlist;

/**
 * 单链表
 */
public class SingleLinkedList {

    public HeroNode head=new HeroNode(0,"","");

    /**
     * 添加数据到单链表
     * @param heroNode
     */
    public void add(HeroNode heroNode){
        //头节点不能动，我们需要一个辅助节点temp
        HeroNode temp = head;
        //遍历链表，找到最后
        while (true) {
            if (temp.next==null){
                break;
            }
            //如果没有找到就后移
            temp=temp.next;
        }
        //将最后一个节点的next指向新的节点
        temp.next = heroNode;
    }

    /**
     * 删除节点
     */
    public void delete(int no) {
        HeroNode temp = head;
        boolean flag = false; // 标志是否找到待删除节点的
        while(true) {
            if(temp.next == null) { //已经到链表的最后
                break;
            }
            if(temp.next.no == no) {
                //找到的待删除节点的前一个节点temp
                flag = true;
                break;
            }
            temp = temp.next; //temp后移，遍历
        }
        //判断flag
        if(flag) { //找到
            //可以删除
            temp.next = temp.next.next;
        }else {
            System.out.printf("要删除的 %d 节点不存在\n", no);
        }
    }

    /**
     * 修改
     */
    public void  update(HeroNode newHeroNode){
        if (head.next==null){
            System.out.println("链表为空");
            return;
        }

        //根据no找到需要修改的节点
        HeroNode temp=head.next;
        boolean flag=false;
        while (true){
            if (temp==null){
                break;
            }
            if (temp.no==newHeroNode.no){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if (flag){
            temp.name= newHeroNode.name;
            temp.nickname= newHeroNode.nickname;
        }else {
            System.out.println("没有找到编号为："+ newHeroNode.no+"的节点，不能修改");
        }
    }

    /**
     * 根据排名插入
     */
    public void  addByOrder(HeroNode heroNode){
        HeroNode temp=head;

        boolean flag=false;
        while (true) {
            if (temp.next == null){
                break;
            }
            if (temp.next.no>heroNode.no){
                break;
            }else if (temp.next.no == heroNode.no){
                flag = true;
                break;
            }
            temp=temp.next;
        }
        if (flag) {
            System.out.printf("准备插入的英雄的编号%d已经存在了，不能加入",heroNode.no);
        }else {
            heroNode.next=temp.next;
            temp.next=heroNode;
        }
    }

    /**
     * 显示链表
     */
    public void list(){
        if (head.next==null){
            System.out.println("链表为空");
            return;
        }
        //头节点不能动，需要一个辅助变量来遍历
        HeroNode temp = head.next;
        while (true) {

            if (temp==null){
                break;
            }
            //输出节点的信息
            System.out.println(temp);
            //将temp后移
            temp=temp.next;
        }
    }

}
